package com.SingleLinkedList;
/**
 定义SingleLinkedList管理结点
 **/
public class SingleLinkedList {
    //初始化头结点，只表示单向链表的头部，不存放任何数据
    private HeroNode head = new HeroNode();

    public HeroNode getHead() {
        return head;
    }

    /**
     * 添加结点：直接将结点添加到链表尾部
     * 1.找到链表的最后一个结点（尾部
     * 2.将最后一个结点的next指向新的结点
     * 缺陷：无法按照指定顺序进行插入，并且可以插入重复的数据
     */
    public void addNode(HeroNode heroNode){
        //头结点head不能动，通过添加辅助变量指向head遍历获取最后一个结点
        HeroNode temp = head;
        while (temp.next != null){
            temp = temp.next;
        }
            //如果不是最后一个结点，就将下一个结点赋给temp

        //当退出循环时，temp就指向了最后一个结点
        //将最后个结点的next指向新的结点
        temp.next = heroNode;

    }
    /**
     * 按照顺序插入结点
     * 1.通过辅助结点遍历找到添加位置的前一个结点
     * 2.newNode.next = temp.next
     * 3.temp.next = newNode
     **/
    public void addNodeByOrder(HeroNode node){
        HeroNode temp = head;
        boolean flag = false;
        while(temp.next != null){
            //一旦temp为最后一个结点
            // 或不是最后一个结点时，后面结点的编号大于或等于插入结点编号则退出循环，表示temp位置就已找到
            if(temp.next.no > node.no){
                break;
            }
            if(temp.next.no == node.no){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if(flag){
            System.out.println("节点编号"+node.no+"已存在，无需重复插入相同的数据");
        }else {
            node.next = temp.next ;
            temp.next = node;
        }
    }
    /**
     * 通过辅助变量遍历显示链表
     **/
    public void showLinkedList(){
        //先判断链表是否为空，即head.next = null
        if(head.next == null){
            System.out.println("当前链表为空，没有结点");
            return;
        }
        //没有退出表示至少存在一个结点
        HeroNode temp = head.next;
        do{
            System.out.println(temp);
            temp = temp.next;
        }while(temp != null);
    }
    /**
     * 修改结点，但不修改结点编号
     * 根据编号找到需要修改的结点位置，并用新结点替换
     * 这里是直接修改原结点，所以辅助结点temp直接为该结点
     */
    public void updateNode(HeroNode node){
        //判断链表是否为空，如果链表为空直接退出
        if(head == null){
            System.out.println("当前列表为空");
            return;
        }
        HeroNode temp = head.next;
        //判断是否找到该结点
        boolean flag = false;
        while(temp != null){
            if(temp.no == node.no){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if(flag){
            //flag为true,表示已经找到结点
            temp.name = node.name;
            temp.nickName = node.nickName;
        }else {
            System.out.println("结点编号为"+node.no+"不存在，请添加该结点");
        }
    }
    /**
     * 根据编号找到要删除结点，将该结点前一个结点的next指向该删除结点的next
     * 所以辅助结点temp需要找到删除结点前一个结点
     **/
    public void deleteByNo(int no){
        HeroNode temp = head;
        boolean flag = false;
        while(temp.next != null){
            if(temp.next.no == no){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if(flag){
            temp.next = temp.next.next;
        }else {
            System.out.println("没有找到编号为"+no+"的结点，删除失败");
        }

    }
}
